package com.hnit.exception;


import com.hnit.web.Utils.ResponseResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/*
 * 全局异常处理器
 * -----------------------------------------------
 * 请求成功（带数据）			200
 * 新增资源成功				201
 * 删除资源成功（无数据）		204
 * 无需更新					205
 * -----------------------------------------------
 * 参数错误					400
 * 未登录					    401
 * 无权限					    403
 * 资源不存在				    404
 * 日期格式错误				405
 * -----------------------------------------------
 * 服务器代码异常				500
 * 服务暂时不可用				503
 * -----------------------------------------------
 * */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    // 捕获 NoFileUploadException
    @ExceptionHandler(NoFileUploadException.class)
    public ResponseEntity<ResponseResult> handleNoFileUploadException(NoFileUploadException ex) {
        //   这是客户端的问题，上传的图片为空 返回400
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ResponseResult.builder()
                .code(0) // 错误码
                .msg(ex.getMessage()) // 异常信息作为消息
                .build());
    }

    @ExceptionHandler(InvalidFileTypeException.class)
    public ResponseEntity<ResponseResult> handleInvalidFileTypeException(InvalidFileTypeException ex) {
        // 这是客户端的问题，上传的图片类型异常 返回400
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ResponseResult.builder()
                .code(0) // 错误码
                .msg(ex.getMessage()) // 异常信息作为消息
                .build());
    }

    @ExceptionHandler(FileProcessingException.class)
    public ResponseEntity<ResponseResult> handleFileProcessingException(FileProcessingException ex) {
        // 这是服务端的问题，处理流文件的时候遇到错误，无法写入，没有权限或者网络流中读取文件的时候发生错误
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ResponseResult.builder()
                .code(0) // 错误码
                .msg(ex.getMessage()) // 异常信息作为消息
                .build());
    }
    //写一个Exception的处理
    /**
     * 处理其他异常  Exception是所有异常的父类，所以要放到最后
     */
    @ExceptionHandler(Exception.class)
    public ResponseEntity<ResponseResult> handleException(Exception e) {
        log.error("系统异常", e);
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)  // HTTP 500状态码  服务器内部错
                .body(ResponseResult.builder()
                        .code(0)  // 业务错误码
                        .data("系统异常: " + e.getMessage())
                        .build());
    }

}
